package com.hilihili.controller;

import com.hilihili.domain.entity.Users;
import com.hilihili.service.IUsersService;
import com.hilihili.util.Constant;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 * @Author xhc
 * @Date 2023/11/14 16:43
 * @Version 1.0
 */
@RestController
@RequestMapping("/hilihili")
public class FrontUsersLogin {
    @Autowired
    private IUsersService usersService;

    // 令牌秘钥
    @Value("${token.secret}")
    private String secret;


    /**
     * 登录方法
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody) {
        Users users = usersService.selectUsersByUsername(loginBody.getUsername());
        if (users != null){
            //数据库中有该用户
            //验证密码和用户名
            if (users.getUsername().equals(loginBody.getUsername())&&users.getPassword().equals(loginBody.getPassword())){
                // 生成令牌
                String token = createToken();
                //设置用户token
                users.setToken(token);
                //存入redis
                RedisCache redisCache = new RedisCache();
                redisCache.setCacheObject(Constant.USER_TOKEN, token, Constant.USER_CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
                //去除密码
                users.setPassword("");
                //实体属性 like，数据库alike字段，所以设置一下
                users.setLike(users.getAlike());
                //成返回数据
                return AjaxResult.success(users);
            }
            return AjaxResult.error(Constant.LOGIN_ERROR,"用户名或密码错误");
        }else {
            return AjaxResult.error(Constant.NULL_ERROR,"用户不存在");
        }
    }


    /**
     * 创建令牌
     *
     * @param
     * @return 令牌
     */
    public String createToken()
    {
        String token = IdUtils.fastUUID();

        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        return createToken(claims);
    }
    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    private String createToken(Map<String, Object> claims)
    {
        String token = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }


    /**
     * 注册用户
     */
    @PostMapping("/register")
    public AjaxResult register(@RequestBody RegisterBody user)
    {
        String msg = usersService.register(user);
        return StringUtils.isEmpty(msg) ? AjaxResult.success() : AjaxResult.error(msg);
    }
}



